//+------------------------------------------------------------------+
//|                                                   sysinfoapi.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <WinAPI/windef.h>
#include <WinAPI/winbase.h>

// 计算机名称格式枚举
enum COMPUTER_NAME_FORMAT
{
   ComputerNameNetBIOS,               // NetBIOS名称
   ComputerNameDnsHostname,           // DNS主机名
   ComputerNameDnsDomain,             // DNS域名
   ComputerNameDnsFullyQualified,     // 完全限定DNS名
   ComputerNamePhysicalNetBIOS,       // 物理NetBIOS名称
   ComputerNamePhysicalDnsHostname,   // 物理DNS主机名
   ComputerNamePhysicalDnsDomain,     // 物理DNS域名
   ComputerNamePhysicalDnsFullyQualified, // 完全限定物理DNS名
   ComputerNameMax                    // 最大值
};

// 系统信息结构(兼容旧版)
struct DUMMYSTRUCTNAME
{
   uint              dwOemId;                // OEM标识符
   ushort            wProcessorArchitecture; // 处理器架构
   ushort            wReserved;              // 保留字段
};

// 扩展内存状态结构
struct MEMORYSTATUSEX
{
   uint              dwLength;               // 结构大小
   uint              dwMemoryLoad;          // 内存使用百分比
   ulong             ullTotalPhys;           // 物理内存总量
   ulong             ullAvailPhys;           // 可用物理内存
   ulong             ullTotalPageFile;       // 页面文件总量
   ulong             ullAvailPageFile;       // 可用页面文件
   ulong             ullTotalVirtual;        // 虚拟内存总量
   ulong             ullAvailVirtual;         // 可用虚拟内存
   ulong             ullAvailExtendedVirtual; // 可用扩展虚拟内存
};

// 系统信息结构
struct SYSTEM_INFO
{
   uint              dwOemId;                // OEM标识符
   uint              dwPageSize;             // 页面大小
   PVOID             lpMinimumApplicationAddress; // 最小应用地址
   PVOID             lpMaximumApplicationAddress; // 最大应用地址
   ulong             dwActiveProcessorMask;   // 活动处理器掩码
   uint              dwNumberOfProcessors;   // 处理器数量
   uint              dwProcessorType;         // 处理器类型
   uint              dwAllocationGranularity; // 分配粒度
   ushort            wProcessorLevel;        // 处理器级别
   ushort            wProcessorRevision;     // 处理器修订版本
};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "kernel32.dll"
/// 获取扩展内存状态
/// @param buffer 内存状态结构
/// @return 操作结果
int GlobalMemoryStatusEx(MEMORYSTATUSEX &buffer);

/// 获取系统信息
/// @param system_info 系统信息结构
void GetSystemInfo(SYSTEM_INFO &system_info);

/// 获取系统时间
/// @param system_time 系统时间结构
void GetSystemTime(SYSTEMTIME &system_time);

/// 获取系统时间(文件时间格式)
/// @param system_time_as_file_time 文件时间结构
void GetSystemTimeAsFileTime(FILETIME &system_time_as_file_time);

/// 获取本地时间
/// @param system_time 系统时间结构
void GetLocalTime(SYSTEMTIME &system_time);

/// 获取系统版本号
/// @return 系统版本号
uint GetVersion(void);

/// 设置本地时间
/// @param system_time 系统时间结构
/// @return 操作结果
int SetLocalTime(const SYSTEMTIME &system_time);

/// 获取系统启动后的毫秒数
/// @return 系统运行时间(毫秒)
uint GetTickCount(void);

/// 获取系统启动后的毫秒数(64位)
/// @return 系统运行时间(毫秒)
ulong GetTickCount64(void);

/// 获取系统时间调整信息
/// @param time_adjustment 时间调整值
/// @param time_increment 时间增量
/// @param time_adjustment_disabled 时间调整是否禁用
/// @return 操作结果
int GetSystemTimeAdjustment(uint &time_adjustment, uint &time_increment, int &time_adjustment_disabled);

/// 获取系统目录路径
/// @param buffer 路径缓冲区
/// @param size 缓冲区大小
/// @return 路径长度
uint GetSystemDirectoryW(ushort &buffer[], uint size);

/// 获取Windows目录路径
/// @param buffer 路径缓冲区
/// @param size 缓冲区大小
/// @return 路径长度
uint GetWindowsDirectoryW(ushort &buffer[], uint size);

/// 获取系统Windows目录路径
/// @param buffer 路径缓冲区
/// @param size 缓冲区大小
/// @return 路径长度
uint GetSystemWindowsDirectoryW(ushort &buffer[], uint size);

/// 获取计算机名称
/// @param name_type 名称类型
/// @param buffer 名称缓冲区
/// @param size 缓冲区大小
/// @return 操作结果
int GetComputerNameExW(COMPUTER_NAME_FORMAT name_type, ushort &buffer[], uint &size);

/// 设置计算机名称
/// @param name_type 名称类型
/// @param buffer 新名称
/// @return 操作结果
int SetComputerNameExW(COMPUTER_NAME_FORMAT name_type, const string buffer);

/// 设置系统时间
/// @param system_time 系统时间结构
/// @return 操作结果
int SetSystemTime(const SYSTEMTIME &system_time);

/// 获取扩展版本信息
/// @param version_information 版本信息结构
/// @return 操作结果
int GetVersionExW(OSVERSIONINFOW &version_information);

/// 获取逻辑处理器信息
/// @param buffer 处理器信息数组
/// @param returned_length 返回的数据长度
/// @return 操作结果
int GetLogicalProcessorInformation(SYSTEM_LOGICAL_PROCESSOR_INFORMATION &buffer[], uint &returned_length);

/// 获取扩展逻辑处理器信息
/// @param relationship_type 关系类型
/// @param buffer 处理器信息数组
/// @param returned_length 返回的数据长度
/// @return 操作结果
int GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR_RELATIONSHIP relationship_type, SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX &buffer[], uint &returned_length);

/// 获取原生系统信息
/// @param system_info 系统信息结构
void GetNativeSystemInfo(SYSTEM_INFO &system_info);

/// 获取精确系统时间(文件时间格式)
/// @param system_time_as_file_time 文件时间结构
void GetSystemTimePreciseAsFileTime(FILETIME &system_time_as_file_time);

/// 获取产品信息
/// @param os_major_version 主版本号
/// @param os_minor_version 次版本号
/// @param sp_major_version 服务包主版本
/// @param sp_minor_version 服务包次版本
/// @param returned_product_type 返回的产品类型
/// @return 操作结果
int GetProductInfo(uint os_major_version, uint os_minor_version, uint sp_major_version, uint sp_minor_version, uint &returned_product_type);

/// 枚举系统固件表
/// @param firmware_table_provider_signature 固件表提供者签名
/// @param firmware_table_enum_buffer 枚举缓冲区
/// @param buffer_size 缓冲区大小
/// @return 枚举结果
uint EnumSystemFirmwareTables(uint firmware_table_provider_signature, PVOID &firmware_table_enum_buffer, uint buffer_size);

/// 枚举系统固件表(字节数组版本)
/// @param firmware_table_provider_signature 固件表提供者签名
/// @param firmware_table_enum_buffer 枚举缓冲区
/// @param buffer_size 缓冲区大小
/// @return 枚举结果
uint EnumSystemFirmwareTables(uint firmware_table_provider_signature, uchar &firmware_table_enum_buffer[], uint buffer_size);

/// 获取系统固件表
/// @param firmware_table_provider_signature 固件表提供者签名
/// @param firmware_table_id 固件表ID
/// @param firmware_table_buffer 固件表缓冲区
/// @param buffer_size 缓冲区大小
/// @return 固件表大小
uint GetSystemFirmwareTable(uint firmware_table_provider_signature, uint firmware_table_id, PVOID firmware_table_buffer, uint buffer_size);

/// 获取系统固件表(字节数组版本)
/// @param firmware_table_provider_signature 固件表提供者签名
/// @param firmware_table_id 固件表ID
/// @param firmware_table_buffer 固件表缓冲区
/// @param buffer_size 缓冲区大小
/// @return 固件表大小
uint GetSystemFirmwareTable(uint firmware_table_provider_signature, uint firmware_table_id, uchar &firmware_table_buffer[], uint buffer_size);

/// 主机名转换为计算机名
/// @param hostname 主机名
/// @param computer_name 计算机名缓冲区
/// @param size 缓冲区大小
/// @return 操作结果
int DnsHostnameToComputerNameExW(const string hostname, ushort &computer_name[], uint &size);

/// 获取物理安装的系统内存
/// @param total_memory_in_kilobytes 总内存(KB)
/// @return 操作结果
int GetPhysicallyInstalledSystemMemory(ulong &total_memory_in_kilobytes);

/// 设置计算机名(扩展)
/// @param name_type 名称类型
/// @param flags 标志位
/// @param buffer 新名称
/// @return 操作结果
int SetComputerNameEx2W(COMPUTER_NAME_FORMAT name_type, uint flags, const string buffer);

/// 设置系统时间调整
/// @param time_adjustment 时间调整值
/// @param time_adjustment_disabled 是否禁用时间调整
/// @return 操作结果
int SetSystemTimeAdjustment(uint time_adjustment, int time_adjustment_disabled);

/// 安装ELAM证书信息
/// @param elam_file ELAM文件句柄
/// @return 操作结果
int InstallELAMCertificateInfo(HANDLE elam_file);

/// 获取处理器系统周期时间
/// @param group 处理器组
/// @param buffer 缓冲区
/// @param returned_length 返回的数据长度
/// @return 操作结果
int GetProcessorSystemCycleTime(ushort group, PVOID &buffer, uint &returned_length);

/// 获取处理器系统周期时间(结构体版本)
/// @param group 处理器组
/// @param buffer 周期时间数组
/// @param returned_length 返回的数据长度
/// @return 操作结果
int GetProcessorSystemCycleTime(ushort group, SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION &buffer[], uint &returned_length);

/// 设置计算机名
/// @param computer_name 新计算机名
/// @return 操作结果
int SetComputerNameW(const string computer_name);
#import
//+------------------------------------------------------------------+